/**
* \file		Production.c
* \brief	Code des fonctions du module Production
* \details	Code du module Production.
* \link Production.h
*/

#include "Production.h"

void initProd(Production* prod)
{
  prod->nom = NULL;
  prod->pourcentageProd = 0;
  prod->vitesseProd = 0;
}

void creerProd(Production** prod)
{
  *prod = (Production*) malloc(sizeof(Production));
  initProd(*prod);
}

char* getNomProd(const Production* prod)
{
  return prod->nom;
}

int getPourcentageProd(const Production* prod)
{
  return prod->pourcentageProd;
}

int getVitesseProd(const Production* prod)
{
  return prod->vitesseProd;
}

void setNomProd(Production* prod, char* nouvNom)
{
  if(strcmp(nouvNom,"bois") == 0
     || strcmp(nouvNom, "metal") == 0
     || strcmp(nouvNom,"houblon") == 0
     || strcmp(nouvNom, "biere") == 0
     || strcmp(nouvNom, "nourriture") == 0)
	{
	   prod->nom = (char*)malloc((strlen(nouvNom) +1) * sizeof(char));
	   strcpy(prod->nom, nouvNom);
	}  
  else
    printf("Tentative d'attribuer un nom incorrect à une production.\n");
  
}

void ajouteVitesseProd(Production* prod, int varVitesseProd)
{
  if(prod->vitesseProd+varVitesseProd <= 0)
    prod->vitesseProd = 0;

  else
    prod->vitesseProd += varVitesseProd;
}

void ajoutePourcentageProd(Production* prod, int varPourcentageProd)
{
  if(prod->pourcentageProd+varPourcentageProd <= 0)
    prod->pourcentageProd = 0;

  else
    prod->pourcentageProd += varPourcentageProd;
}


void incrementeProd(Production* prod, Entrepot* entrepot)
{
  char* nomTemp = prod->nom;
  int modificateur = 0;

  modificateur = getBonusProd(entrepot);
  prod->pourcentageProd += (prod->vitesseProd + modificateur);

  if(prod->pourcentageProd >= 100)
    {
      if(strcmp(nomTemp, "bois") == 0)
	{
	  ajouteBoisEntr(entrepot,10);
	}
      else if(strcmp(nomTemp,"metal") == 0)
	{
	  ajouteMetalEntr(entrepot,10);
	}
      else if(strcmp(nomTemp,"houblon") == 0)
	{
	  ajouteHoublonEntr(entrepot,10);
	}
      else if(strcmp(nomTemp, "biere") == 0)
	{
	  ajouteBiereEntr(entrepot,10);
	}
      else if(strcmp(nomTemp,"nourriture") == 0)
	{
	  ajouteNourritureEntr(entrepot,10);
	}
      /*report du surplus du pourcentage de production*/
      prod->pourcentageProd -= 100;
    }
}

void libereProd(Production* prod)
{
   if(NULL != getNomProd(prod))
	{
	   free(prod->nom);
	}
}

void detruireProd(Production* prod)
{
   libereProd(prod);
   free(prod);
}


void testProd()
{
  int i;

  Production* production = NULL;
  Entrepot* entrepot;
  char nom[] = "bois";
  char* nomVerif;
  int vitesseVerif = 0;
  int pourcentageVerif = 0;

  creerEntr(&entrepot);
  printf("\nTest de Production\n");


  creerProd(&production);
  if(production->nom == NULL && production->pourcentageProd == 0 && production->vitesseProd == 0)
    printf("\tInitialisation ...OK\n");

  setNomProd(production,nom);
  nomVerif = getNomProd(production);
  if(strcmp(nom, nomVerif) == 0) printf("\tset/getNomProd avec %s ...OK\n", nomVerif);

  ajouteVitesseProd(production, 20);
  vitesseVerif =  getVitesseProd(production);
  if(vitesseVerif == 20) printf("\tset/getVitesseProd avec une valeur de %d ...OK\n",vitesseVerif);

  ajoutePourcentageProd(production, 10);
  pourcentageVerif = getPourcentageProd(production);
  if(pourcentageVerif == 10) printf("\tset/getPourcentageProd avec une valeur de %d ...OK\n",pourcentageVerif);

  for(i=0;i<5;i++)
    {
      incrementeProd(production,entrepot);

      pourcentageVerif = getPourcentageProd(production);
      printf("\tCycle %d: Pourcentage de production: %d\n",i+1,pourcentageVerif);

      printf("\t         Bois: %u, Metal: %u,Houblon: %u, Nourriture: %u, Biere: %u\n", getBoisEntr(entrepot), getMetalEntr(entrepot), getHoublonEntr(entrepot), getNourritureEntr(entrepot), getBiereEntr(entrepot));
    }
  if(vitesseVerif == 20 && pourcentageVerif == 10 && getBoisEntr(entrepot) == 10) printf("\tIncrementation ... OK\n");

  detruireProd(production);
  detruireEntr(entrepot);
}
